#include"astnodes.h"
#include"nfanode.h"
void RegularExpressionNode_char::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    begin = new NFA_node();
    end = new NFA_node();
    begin->add_edge(this->ch,end);
}
void RegularExpressionNode_or::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    begin = new NFA_node();
    end = new NFA_node();
    NFA_node* begin1,*end1;
    NFA_node* begin2,*end2;
    exp1->ConstructNFA(begin1,end1);
    exp2->ConstructNFA(begin2,end2);
    begin->add_edge(0,begin1);
    begin->add_edge(0,begin2);
    end1->add_edge(0,end);
    end2->add_edge(0,end);
}
void RegularExpressionNode_concat::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    begin = new NFA_node();
    end = new NFA_node();
    NFA_node* begin1,*end1;
    NFA_node* begin2,*end2;
    exp1->ConstructNFA(begin1,end1);
    exp2->ConstructNFA(begin2,end2);
    begin->add_edge(0,begin1);
    end1->add_edge(0,begin2);
    end2->add_edge(0,end);
}
void RegularExpressionNode_star::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    begin = new NFA_node();
    end = new NFA_node();
    NFA_node* begin1,*end1;
    exp->ConstructNFA(begin1,end1);
    begin->add_edge(0,begin1);
    end1->add_edge(0,end);
    begin->add_edge(0,end);
    end1->add_edge(0,begin1);
}
void RegularExpressionNode_paren::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    exp->ConstructNFA(begin,end);
}
void RegularExpressionNode_null::ConstructNFA(NFA_node*&begin,NFA_node*&end){
    begin = new NFA_node();
    end = new NFA_node();
    begin->add_edge(0,end);
}